package myList;

import java.util.Arrays;

public class MyArrayList implements IList{
    // 动态扩容的一个数组
    public int[] arr;
    public static final int numsize = 2;

    int usesize;// 统计数组中有多少个有效元素

    // 静态大小的数组
    public MyArrayList(){
        this.arr = new int[numsize];
    }

    // 动态的大小的数组
    public MyArrayList(int capacity){
        this.arr = new int[capacity];
    }

    /*
      遍历顺序表
     */
    public void display() {
        for(int i = 0;i < this.usesize;i++){
            System.out.print(this.arr[i]+" ");
        }
        System.out.println();
    }


    @Override
    public boolean isFull() {
        if(this.numsize == this.usesize) return true;
        return false;
    }

    // 在数组的最后尾插一个元素
    @Override
    public void add(int data) {
        checkCapacity();
        this.arr[this.usesize] = data;
        this.usesize++;
    }

    // 在指定位置(pos位置)新增元素
    @Override
    public void add(int pos, int data) {
       try{
           checkPos(pos);
       }catch(PosIllegality e){
           e.printStackTrace();
           // 处理异常
           return;
       }
       checkCapacity();


        for(int i = usesize - 1;i >= pos;i--){
            arr[i+1] = arr[i];
        }
        this.arr[pos] = data;
        this.usesize++;
    }
    // 检查下标的合法性
    private void checkPos(int pos) throws PosIllegality{
        if(pos < 0 || pos > usesize){
            System.out.println("下标不合法");
            // 抛异常
            throw new PosIllegality("下标不合法异常");
        }
    }

    // 检查容量够不够函数
    private void checkCapacity(){
        if(isFull()){
            // 扩容
            arr = Arrays.copyOf(arr,arr.length*2);
        }
    }

    // 判定是否包含某个元素
    @Override
    public boolean contains(int toFind) {
        if(isEmpty()) return false;

        for(int i = 0;i < usesize;i++){
            // 如果是查找引用数据类型,一定要重写 比较方法
            if(toFind == arr[i]) return true;
        }

        return false;
    }

    public boolean isEmpty(){
        if(usesize == 0) return true;
        else return false;
    }

    // 查找某个元素对应的位置
    @Override
    public int indexOf(int toFind) {
        if(isEmpty()) return -1;

        for(int i = 0;i < usesize;i++){
            // 如果是查找引用数据类型,一定要重写 比较方法
            if(toFind == arr[i]) return i;
        }

        return -1;
    }

    @Override
    public int get(int pos) throws MyArrayEmpty {
        checkPosOnGet(pos);

        if(isEmpty()){
            // 抛异常
           throw new MyArrayEmpty("获取指定下标元素时,顺序表为空");
        }

        return arr[pos];
    }

    private void checkPosOnGet(int pos) throws PosIllegality{
        if(pos < 0 || pos >= usesize){
            System.out.println("下标不合法");
            // 抛异常
            throw new PosIllegality("下标不合法异常");
        }
    }


    private void checkPosOnSet(int pos) throws PosIllegality{
        if(pos < 0 || pos >= usesize){
            System.out.println("下标不合法");
            // 抛异常
            throw new PosIllegality("下标不合法异常");
        }
    }


    @Override
    public void set(int pos, int value) {
        checkPosOnSet(pos);

        arr[pos] = value;
    }

    // 删除第一次出现的元素
    @Override
    public void remove(int toRemove) {
        int k = indexOf(toRemove);

        if(k == -1){
            System.out.println("没有找到这个数");
            return;
        }

        for(int i = k;i < this.usesize - 1;i++){
            arr[i] = arr[i+1];
        }

        this.usesize--;
    }

    @Override
    public int size() {
        return this.usesize;
    }

    // 清空顺序表
    @Override
    public void clear() {
        this.usesize = 0;
    }
}
